package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.UserFavors;
import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.repository.UserFavorsRepository;
import cn.wolfcode.wolf2w.service.IUserInfoRedisService;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.Consts;
import cn.wolfcode.wolf2w.util.LogicException;
import cn.wolfcode.wolf2w.util.RedisKey;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class UserInfoRedisServiceImpl implements IUserInfoRedisService {

    @Autowired
    private StringRedisTemplate template;
    @Autowired
    private IUserInfoService userInfoService;
    @Autowired
    private UserFavorsRepository userFavorsRepository;

    @Override
    public void sendVerifyCode(String phone) {
        // 使用UUID设置一个验证码
        String code = UUID.randomUUID().toString().
                replaceAll("-", "").substring(0, 4);

        System.out.println(code);
        // 把发送的UUID缓存到redis中
        template.opsForValue().set(RedisKey.VERIFY_CODE.join(phone), code, Consts.VERIFY_CODE_VAI_TIME*60L,TimeUnit.SECONDS );
        //假装成功发送到手机上了
        System.out.println("已成功发送验证码");


        /*String url = "https://way.jd.com/chuangxin/dxjk?mobile={1}&content=【创信】你的验证码是：{2}，3分钟内有效！&appkey=5b0ae3e7ebbadd3a3a91d6cd18eee410";

        // 用java代码发起http请求
        // RestTemplate是springmvc提供的一个工具类 , 用于发起http请求
        RestTemplate template = new RestTemplate();
        // 参数1为请求路径,参数2为返回数据封装的类型,后面的参数为占位符的值
        String ret = template.getForObject(url, String.class,phone,code);

        System.out.println(ret);
        if (!ret.contains("Success")){
            throw new LogicException("短信发送失败");
        }*/

    }

    @Override
    public String setToken(UserInfo user) {
        // 使用UUID来创建token令牌
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        String key = RedisKey.USER_LOGIN_TOKEN.join(token);
        // 把用户对象转换成Json格式的字符串
        String value = JSON.toJSONString(user);

        // 把以token为key存储用户对象到redis数据库中并设置失效时间
        // 失效时间为30分钟
        template.opsForValue().set(key, value, RedisKey.USER_LOGIN_TOKEN.getExpirationTime(), TimeUnit.SECONDS);

        return token;
    }


    @Override
    public UserInfo getToken(String token) {
        if (!StringUtils.hasLength(token)){
            // 如果传过来的token为空,直接返回null
            return null;
        }
        String key = RedisKey.USER_LOGIN_TOKEN.join(token);
        if (template.hasKey(key)){
            // 如果redis中有这个key,就把他查出来
            String userJson = template.opsForValue().get(key);
            // 重置token在redis中的有效时间
            template.expire(key, RedisKey.USER_LOGIN_TOKEN.getExpirationTime(), TimeUnit.SECONDS);
            // 把存在redis中json格式的用户对象格式化为UserInfo对象
            return JSON.parseObject(userJson,UserInfo.class);
        }
        return null;
    }

    @Override
    public List<String> getFavorList(String uid) {
        //拼接id
        String key = RedisKey.USER_STRATEGT_FAVOR_.join(uid);
        //先定义一个空的集合
        List<String> favors = new ArrayList<>();
        if (template.hasKey(key)){
            //如果已经有这个key了
            //那么直接把value查出来给到faver并返回
            favors = JSON.parseArray(template.opsForValue().get(key), String.class);
        }
            //如果没有这个key
            //那么表示用户并没有收藏任何攻略
            //直接返回空集合
        return favors;
    }

}
